package org.budo.phone.api;

/**
 * @author limingwei
 * @see org.budo.phone.api.BudoPhoneApi
 */
public interface BudoPhoneEvent {

    enum Direction {
        /**
         * 呼入
         */
        Inbound,

        /**
         * 呼出
         */
        Outbound;

        /**
         * 参考容联
         */
        public int toInt() {
            return Inbound.equals(this) ? 0 : 1;
        }
    }

    enum Type {
        /**
         * 呼叫鉴权，手动或半自动输入号码发起呼叫时会回调
         */
        CallAuth,

        /**
         * 呼叫建立
         */
        CallEstablish,

        /**
         * 挂机
         */
        Hangup,

        /**
         * 挂机完成
         */
        HangupComplete,

        // 群呼发起
        LaunchService,

        // 群呼被叫振铃
        ReachService,

        // 呼入接入
        StartService,

        // 群呼接入
        EstablishService,

        /**
         * 坐席状态变更 坐席在被锁定到挂机的过程中都会有状态改变
         * https://doc.yuntongxun.com/p/5a534dd03b8496dd00dce26b
         */
        AgentState,

        //
        DtmfReport,

        //呼叫建立
        ChannelCreate,

        //
        StopService,

        //录音结束
        RecordStop,
        //进入队列
        EnterQueue,
        //打断
        BreakService,
        // 单边挂断
        PublicALegHangup,
        //客户端上线注册事件
        Register,
        //客户端注册下线事件
        UnRegister
    }

    enum CallState {
        //
        DOWN,
        /** 拨号 **/
        DIALING,
        /** 振铃 **/
        RINGING,
        /** 呼叫中 **/
        EARLY,
        /**  接通 **/
        ACTIVE,
        /**通话连接建立**/
        HELD,
        /** 等待铃声 **/
        RING_WAIT,
        /** 通话连接断开 **/
        UNHELD,
        /**  通话已挂断 **/
        HANGUP;
        
        public static CallState getCallStateByName(String name){
            for (CallState value : values()) {
                if(value.name().equals(name)){
                    return value;
                }
            }
            return null;
        }
    }

    /**
     * 事件类型
     */
    Type getType();

    /**
     * 呼叫ID
     */
    String getCallId();


    String getALegCallId();

    CallState getCallState();

    /**
     * 方向 呼入/呼出
     */
    Direction getDirection();

    /**
     * SIP用户
     */
    String getSipUser();

    /**
     * 中继号码,配置在网关和FS上
     */
    String getPostNumber();

    /**
     * 客户号码,呼入的主叫方,呼出的被叫方
     */
    String getCustomerNumber();

    /**
     * 商家号码,呼入的被叫方,呼出的主叫方
     */
    String getMerchantNumber();

    /**
     * 外呼时为商家号码,呼入时为客户号码
     */
    String getFromNumber();

    /**
     * 外呼时为客户号码,呼入时为商家号码
     */
    String getToNumber();
}